//
// Created by lenovo on 2024/1/13.
//
#include "./ListTool.h"
#include <limits>




namespace Functions{

    class Sum : public iFunction{
    public :
        double calc (std::vector<double> _argv) override {
            if (_argv.empty()){
                throw std::logic_error("Empty Args for Funcs Sum");
            }

            int result =  0 ;
            for (auto arg : _argv){
                result += arg ;
            }
            return result ;
        }
    };

    Sum sum ;


    class Max : public iFunction{
    public :
        double calc(std::vector<double> _argv) override{
            if (_argv.empty()){
                throw std::logic_error("Empty Args for Funcs Max");
            }
            if (_argv.size() == 1){
                return _argv[0];
            }

            double max = std::numeric_limits<double>::min();
            for (auto arg : _argv){
                if (arg > max){
                    max = arg ;
                }
            }
            return max ;
        }
    };
    Max max ;

    class Min : public iFunction{
    public :
        double calc(std::vector<double> _argv) override{
            if (_argv.empty()){
                throw std::logic_error("Empty Args for Funcs Max");
            }
            if (_argv.size() == 1){
                return _argv[0];
            }

            double min = std::numeric_limits<double>::max();
            for (auto arg : _argv){
                if (arg < min){
                    min = arg ;
                }
            }
            return min ;
        }
    };
    Min min ;


    std::map<
            std::string ,
            iFunction*
    >
    ListFunc = {
            {"sum" , &sum },
            {"max" , &max },
            {"min" , &min }
    };


}
